ECS タスクで OutOfMemoryError が記録されてタスクが終了するときの対処方法
困っていた内容
Fargate で自社アプリを稼働させていますが、一部 ECS タスクがOutOfMemoryError
で突然停止しました。調べてみると Java 関係のエラーのようですが、自社アプリでは Java は使っていません。
Fargate 基盤側のエラーでしょうか?対処法を教えてください。
どう対応すればいいの?
メモリ消費が増加した原因の修正、もしくはタスクサイズの見直しを検討してください。
仕様としてタスク定義で割り当てられているメモリを越えようとすると、コンテナが強制停止されます。そのためOutOfMemoryError
で停止したコンテナは、メモリ消費量が指定値を超えてしまったことが停止の理由となります。なお、Out Of Memory(OOM)は一般的なエラーの一つです。
OutOfMemoryError
このエラーは、タスク定義で割り当てられているよりも多くのメモリをコンテナ内のプロセスで消費しているためにコンテナーが終了したときに発生します。
メモリ消費量が増加した原因は、アプリケーションが出力したログや、CloudWatch メトリクス等から確認できることが期待されます。メモリ消費量が増加した原因に応じて、タスクサイズの見直しや、アプリケーションの修正等をご検討ください。
なお、Fargate 起動タイプでタスクサイズで指定できる CPU とメモリの組み合わせには制約がありますのでご注意ください。
Fargate タスク定義の考慮事項 - Amazon ECS
また、EC2 起動タイプの場合は一時的なメモリ需要に備えて、スワップの有効化も選択肢となります。
参考資料
- Amazon ECS における OutOfMemory エラーのトラブルシューティング
- コンテナスワップ領域の管理 - Amazon Elastic Container Service
- Amazon ECS のタスクにメモリを割り当てる
- タスク定義パラメータ - Amazon ECS
- 詳解: Amazon ECS による CPU とメモリのリソース管理 | Amazon Web Services ブログ
- ステータスチェックに失敗したインスタンスのトラブルシューティング - Amazon Elastic Compute Cloud
メモリ不足エラーは、下記のようなシステムログで示されます。
[115879.769795] Out of memory: kill process 20273 (httpd) score 1285879